/* eslint-disable max-statements */ import type { MDXComponents } from 'mdx/types'; import type { GetStaticPaths, GetStaticProps } from 'next'; import dynamic from 'next/dynamic'; import Head from 'next/head'; import NextImage, { type ImageProps as NextImageProps } from 'next/image'; import { useRouter } from 'next/router'; import Script from 'next/script'; import type { ComponentType, HTMLAttributes, ReactNode } from 'react'; import { useIntl } from 'react-intl'; import { Code, getLayout, Link, PageLayout, SharingWidget, Spinner, Heading, List, ListItem, Figure, type MetaItemData, Time, Grid, ProjectOverview, type ProjectMeta, type Repository, } from '../../components'; import styles from '../../styles/pages/project.module.scss'; import type { NextPageWithLayout, ProjectPreview, Repos } from '../../types'; import { ROUTES } from '../../utils/constants'; import { getSchemaJson, getSinglePageSchema, getWebPageSchema, } from '../../utils/helpers'; import { getProjectData, getProjectFilenames, loadTranslation, type Messages, } from '../../utils/helpers/server'; import { useBreadcrumb, useGithubApi, useSettings } from '../../utils/hooks'; const BorderedImage = (props: NextImageProps) => (
); const H1 = ({ children = '', ...props }: HTMLAttributes) => ( {children} ); const H2 = ({ children = '', ...props }: HTMLAttributes) => ( {children} ); const H3 = ({ children = '', ...props }: HTMLAttributes) => ( {children} ); const H4 = ({ children = '', ...props }: HTMLAttributes) => ( {children} ); const H5 = ({ children = '', ...props }: HTMLAttributes) => ( {children} ); const H6 = ({ children = '', ...props }: HTMLAttributes) => ( {children} ); const OrderedList = ({ children, ...props }: HTMLAttributes) => ( {children} ); const UnorderedList = ({ children, ...props }: HTMLAttributes) => ( {children} ); const Gallery = ({ children }: { children: ReactNode[] }) => ( { return { id: `${index}`, item: child }; })} sizeMin="250px" /> ); const components: MDXComponents = { Code, Gallery, h1: H1, h2: H2, h3: H3, h4: H4, h5: H5, h6: H6, Image: BorderedImage, li: ({ ref, ...props }) => , Link, ol: OrderedList, ul: UnorderedList, }; type ProjectPageProps = { project: ProjectPreview; translation: Messages; }; /** * Project page. */ const ProjectPage: NextPageWithLayout = ({ project }) => { const { id, intro, meta, title } = project; const { cover, dates, license, repos, seo, technologies } = meta; const intl = useIntl(); const { items: breadcrumbItems, schema: breadcrumbSchema } = useBreadcrumb({ title, url: `${ROUTES.PROJECTS}/${id}`, }); const ProjectContent: ComponentType = dynamic( async () => import(`../../content/projects/${id}.mdx`), { loading: () => , } ); const { website } = useSettings(); const { asPath } = useRouter(); const page = { title: `${seo.title} - ${website.name}`, url: `${website.url}${asPath}`, }; const headerMeta: (MetaItemData | undefined)[] = [ { id: 'publication-date', label: intl.formatMessage({ defaultMessage: 'Published on:', description: 'ProjectsPage: publication date label', id: 'HxZvY4', }), value: